package org.game.version01;

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;

import javax.imageio.ImageIO;

/**
 * Clase que da graficos a quien los necesite. La definicion de sprite tiene muchos significados, pero en conclusion, denota una imagen
 * o una animacion en un escenario. Es usado en movimientos de algun objeto en juegos. 
 * @author Nicolas Vargas Ortega.
 *
 */

public class SpriteCache {
	
	/** Vamos a tener un hashmap para asociar el nombre de cada sprite con su imagen en memoria. Para saber cuales sprites estan cargados,
	 * y caules no. */
	private HashMap sprites;
	
	/** Constructor del mapa. */
	public SpriteCache(){
		this.sprites = new HashMap();
	}
	
	/** Metodo para cargar las imagenes. El metodo read de la clase ImageIO, le entra como parametro una imagen (File), que se obtiene
	 * a traves de un String con la direccion de la misma. Si hay algun error, salta la excepcion. */
	private BufferedImage loadImage(String nombre) {
		File imagen = new File(nombre);
		try {
			return ImageIO.read(imagen);
		} catch (Exception e) {
			System.out.println("No se pudo cargar la imagen " + nombre);
			System.out.println("El error fue : " + e.getClass().getName() + " "
					+ e.getMessage());
			System.exit(0);
			return null;
		}
	}
	
	/** Devuelve el sprite, por ello tiene que ser publico. Crea un buffer con el sprite del nombre que tiene asociado,
	 * si ese buffer esta vacio, quiere decir que la imagen no esta cargada, entonces cargamos la imagen, si no, devolvemos el sprite.*/
	public BufferedImage getSprite(String nombre) {
		BufferedImage img = (BufferedImage) this.sprites.get(nombre);
		if (img == null) {
			img = loadImage(System.getProperty("user.dir") + File.separator
					+ "res" + File.separator + nombre);
			this.sprites.put(nombre, img);
		}
		return img;
	}

}
